package com.stylefeng.guns.core.aop;

import com.stylefeng.guns.core.common.constant.Const;
import com.stylefeng.guns.core.page.PageInfoBT;
import com.stylefeng.guns.core.shiro.ShiroKit;
import com.stylefeng.guns.core.util.ObjectUtil;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;

/**
 * 描述:请求参数拦截
 * 创建人: xiang
 * 日期: 2018/7/28
 * 时间: 15:43
 */
@Aspect
@Component
public class ControllerParameterAop {
    private Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 描述:获取注解@RequestMapping的切面拦截
     * 创建人: xiang
     * 日期: 2018/7/28
     * 时间: 16:55
     */
    @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void cutApi() {
    }


    /**
     * 描述:添加aop拦截 不是总平台时自动设置平台值
     * 创建人: xiang
     * 日期: 2018/7/28
     * 时间: 16:22
     */
    //执行方法前的拦截方法
    @Before("cutApi()")
    public void doBeforeMethod(JoinPoint joinPoint) {
        //获取目标方法的参数信息
        Object[] obj = joinPoint.getArgs();

            for (Object argItem : obj) {
                try {
                    // 调用某类中的 某方法
                    Class<?> clazz = argItem.getClass();
                    Method getmethod = clazz.getMethod("getPlatform");
                    String platform=null;
                    if(getmethod.invoke(argItem)!=null){
                        platform=getmethod.invoke(argItem).toString();
                    }
                    //1.如果不是总平台 设置setPlatform 当前平台
                    //2.如果有getPlatform 值为null 当前平台
                    if(!Const.DEFAULT_PH.equals(ShiroKit.getUser().getDeptcode()) || StringUtils.isBlank(platform)){
                        Method setmethod = clazz.getMethod("setPlatform",String.class);
                        setmethod.invoke(argItem, ShiroKit.getUser().getDeptcode());
                    }
                } catch (Exception ex) {
                    //没有setPlatform方法 不做任何处理
                    log.error(ex.getMessage());
                }

            }


    }




    /**
     * 描述: Double 格式化 目前只是针对分页数据
     * 创建人: xiang
     * 日期: 2018/8/1
     * 时间: 16:23
     */
    @AfterReturning(value="@annotation(org.springframework.web.bind.annotation.RequestMapping)", argNames="rtv", returning="rtv")
    public void afterInsertMethod(JoinPoint jp, Object rtv) throws Throwable {
        DecimalFormat df = new DecimalFormat("#0.00");
        if(rtv instanceof PageInfoBT){
          List<Object> list=((PageInfoBT) rtv).getRows();
          for(int i=0;i<list.size();i++){
              Map<String,Object> map=null;
              if(list.get(i) instanceof Map){
                  map=( Map<String,Object>)list.get(i);
              }else {
                   map= ObjectUtil.Obj2Map(list.get(i));
              }
              for (Map.Entry<String, Object> entry : map.entrySet()) {
                  if(entry.getValue() instanceof  Double){
                    entry.setValue(df.format((Double) entry.getValue()));
                  }
              }
              list.set(i,map);
          }
        }


    }



}
